package com.team01.pokemon.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.team01.pokemon.entity.Moves;
import com.team01.pokemon.result.Result;
import com.team01.pokemon.service.MovesService;
import com.team01.pokemon.vo.MovesDetailVO;
import com.team01.pokemon.vo.MovesQueryVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 招式表 前端控制器
 * </p>
 *
 * @author author
 * @since 2025-09-13
 */
@RestController
@RequestMapping("/moves")
public class MovesController {

    @Autowired
    private MovesService movesService;

    /**
     * 查询招式列表（旧版本，保持兼容性）
     * 
     * @param query  可选的搜索关键词
     * @param typeId 可选的属性类型ID
     * @return 招式列表
     */
    @GetMapping("/list")
    public Result list(String query, Integer typeId) {
        // 封装查询条件
        LambdaQueryWrapper<Moves> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.hasLength(query), Moves::getMoveName, query);
        wrapper.eq(typeId != null, Moves::getTypeId, typeId);

        // 执行查询
        List<Moves> list = movesService.list(wrapper);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询招式列表成功", list);
        }
        return new Result(false, "查询招式列表失败", null);
    }

    /**
     * 获取所有技能（按编号排序）
     * 
     * @return 技能详情列表
     */
    @GetMapping("/all")
    public Result getAllMoves() {
        List<MovesDetailVO> list = movesService.getAllMoves();
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询所有技能成功", list);
        }
        return new Result(false, "暂无技能数据", null);
    }

    /**
     * 根据宝可梦名称查询其可学习的技能
     * 
     * @param pokemonName 宝可梦名称
     * @param learnMethod 学习方式（可选：level, tm）
     * @param minLevel    最小等级（可选）
     * @param maxLevel    最大等级（可选）
     * @return 技能详情列表
     */
    @GetMapping("/pokemon")
    public Result getMovesByPokemon(@RequestParam("pokemonName") String pokemonName,
            @RequestParam(value = "learnMethod", required = false) String learnMethod,
            @RequestParam(value = "minLevel", required = false) Integer minLevel,
            @RequestParam(value = "maxLevel", required = false) Integer maxLevel) {
        if (!StringUtils.hasLength(pokemonName)) {
            return new Result(false, "宝可梦名称不能为空", null);
        }

        List<MovesDetailVO> list = movesService.getMovesByPokemonName(pokemonName, learnMethod, minLevel, maxLevel);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询宝可梦技能成功", list);
        }
        return new Result(false, "未找到该宝可梦的技能信息", null);
    }

    /**
     * 根据宝可梦ID查询其可学习的技能
     * 
     * @param pokemonId   宝可梦ID
     * @param learnMethod 学习方式（可选：level, tm）
     * @param minLevel    最小等级（可选）
     * @param maxLevel    最大等级（可选）
     * @return 技能详情列表
     */
    @GetMapping("/pokemon-id")
    public Result getMovesByPokemonId(@RequestParam("pokemonId") Integer pokemonId,
            @RequestParam(value = "learnMethod", required = false) String learnMethod,
            @RequestParam(value = "minLevel", required = false) Integer minLevel,
            @RequestParam(value = "maxLevel", required = false) Integer maxLevel) {
        if (pokemonId == null || pokemonId <= 0) {
            return new Result(false, "宝可梦ID不能为空且必须大于0", null);
        }

        List<MovesDetailVO> list = movesService.getMovesByPokemonId(pokemonId, learnMethod, minLevel, maxLevel);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询宝可梦技能成功", list);
        }
        return new Result(false, "未找到该宝可梦的技能信息", null);
    }

    /**
     * 根据属性名称查询该属性的所有技能
     * 
     * @param typeName 属性名称
     * @return 技能详情列表
     */
    @GetMapping("/type")
    public Result getMovesByType(@RequestParam("typeName") String typeName) {
        if (!StringUtils.hasLength(typeName)) {
            return new Result(false, "属性名称不能为空", null);
        }

        List<MovesDetailVO> list = movesService.getMovesByTypeName(typeName);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询属性技能成功", list);
        }
        return new Result(false, "未找到该属性的技能信息", null);
    }

    /**
     * 根据技能名称搜索技能
     * 
     * @param moveName 技能名称
     * @return 技能详情列表
     */
    @GetMapping("/search")
    public Result searchMovesByName(@RequestParam("moveName") String moveName) {
        if (!StringUtils.hasLength(moveName)) {
            return new Result(false, "技能名称不能为空", null);
        }

        List<MovesDetailVO> list = movesService.getMovesByMoveName(moveName);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "搜索技能成功", list);
        }
        return new Result(false, "未找到匹配的技能", null);
    }

    /**
     * 根据等级区间查询技能
     * 
     * @param minLevel    最小等级
     * @param maxLevel    最大等级
     * @param learnMethod 学习方式（可选：level, tm）
     * @return 技能详情列表
     */
    @GetMapping("/level")
    public Result getMovesByLevel(@RequestParam("minLevel") Integer minLevel,
            @RequestParam("maxLevel") Integer maxLevel,
            @RequestParam(value = "learnMethod", required = false) String learnMethod) {
        if (minLevel == null || maxLevel == null) {
            return new Result(false, "等级区间不能为空", null);
        }
        if (minLevel < 0 || maxLevel < 0 || minLevel > maxLevel) {
            return new Result(false, "等级区间设置不正确", null);
        }

        List<MovesDetailVO> list = movesService.getMovesByLevelRange(minLevel, maxLevel, learnMethod);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询等级区间技能成功", list);
        }
        return new Result(false, "该等级区间内暂无技能", null);
    }

    /**
     * 综合查询技能接口（使用POST方法接收复杂参数）
     * 
     * @param queryVO 查询参数
     * @return 技能详情列表
     */
    @PostMapping("/query")
    public Result queryMoves(@RequestBody MovesQueryVO queryVO) {
        if (queryVO == null) {
            return new Result(false, "查询参数不能为空", null);
        }

        List<MovesDetailVO> list = movesService.queryMoves(queryVO);
        if (!CollectionUtils.isEmpty(list)) {
            return new Result(true, "查询技能成功", list);
        }
        return new Result(false, "未找到匹配的技能", null);
    }
}
